home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / unarced / utilities / emulators / apple][ / a2.h < prev    next >
C/C++ Source or Header  |  1995-03-17  |  5KB  |  160 lines

  1. /*
  2.  *  a2, an Apple II emulator in C
  3.  *  (c) Copyright 1990 by Rich Skrenta
  4.  *
  5.  *  Command line interface written by Tom Markson
  6.  *
  7.  *  Distribution agreement:
  8.  *
  9.  *    You may freely copy or redistribute this software, so long
  10.  *    as there is no profit made from its use, sale, trade or
  11.  *    reproduction.  You may not change this copyright notice,
  12.  *    and it must be included prominently in any copy made.
  13.  *
  14.  *  Send emulator related mail to:  skrenta@blekko.commodore.com
  15.  *                    skrenta@blekko.uucp
  16.  */
  17.  
  18.  
  19.  
  20. #define        TRUE        1
  21. #define        FALSE        0
  22.  
  23. extern FILE    *sfp;
  24.  
  25. /*
  26.  *  Assertion verifier
  27.  */
  28. #define    assert(p)    if(! (p)) asfail(__FILE__, __LINE__, "p"); else
  29.  
  30.  
  31. #define        join(low, high)        ((low) | ((high) << 8))
  32. #define        low(x)            ((x) & 0xFF)
  33. #define        high(x)            ((x) >> 8)
  34.  
  35. #define        tobinary(v)        ((v >> 4) * 10 + (v & 0xF))
  36. #define        tobcd(v)        ((v % 10) | ((v / 10) << 4))
  37.  
  38. #define        push(s)            mem[0x100 | Sp--] = s;
  39. #define        pop()            mem[0x100 | ++Sp]
  40.  
  41. #define        SIGN(x)            N = ((x) & 0x80)
  42. #define        ZERO(x)            NZ = (x)
  43. #define        CARRY(x)        C = ((x) > 0xFF)
  44. #define        dCARRY(x)        C = ((x) > 99)
  45.  
  46.  
  47. #define    REF(a)        ((a & 0xF000) == 0xC000 ? mem_map(a) : mem[a])
  48. #define    REFptr        ((ptr & 0xF000) == 0xC000 ? mem_map(ptr) : mem[ptr])
  49. #define    REFzero        mem[ptr]
  50. #define    REFimm        mem[Pc++]
  51.  
  52. #define    SET(a,v)    if (mem_set[a >> 8]) (*mem_set[a >> 8])(a,v); else mem[a] = v;
  53. #define    SETptr(v)    if (mem_set[ptr >> 8]) (*mem_set[ptr >> 8])(ptr,v); else mem[ptr] = v;
  54. #define    SETzero(v)    mem[ptr] = v;
  55.  
  56. #define    PCINC        Pc++;
  57.  
  58. #define    ABSOL        ptr = mem[Pc++]; ptr |= mem[Pc++] << 8;
  59. #define    ABSX        ptr = mem[Pc++]; ptr |= mem[Pc++] << 8; ptr += X;
  60. #define    ABSY        ptr = mem[Pc++]; ptr |= mem[Pc++] << 8; ptr += Y;
  61. #define    ZEROP        ptr = mem[Pc++];
  62. #define    ZEROX        ptr = (mem[Pc++] + X) & 0xFF;
  63. #define    ZEROY        ptr = (mem[Pc++] + Y) & 0xFF;
  64. #define    INDX    stmp = mem[Pc++] + X; ptr = mem[stmp++]; ptr |= mem[stmp] << 8;
  65. #define    INDY    stmp = mem[Pc++]; ptr = mem[stmp++]; ptr |= mem[stmp] << 8; ptr += Y;
  66.  
  67. #define    rZEROP        mem[ mem[Pc++] ]
  68. #define    rZEROX        mem[ (mem[Pc++] + X) & 0xFF ]
  69. #define    rZEROY        mem[ (mem[Pc++] + Y) & 0xFF ]
  70. #define    sZEROP(v)    mem[ mem[Pc++] ] = v;
  71. #define    sZEROX(v)    mem[ (mem[Pc++] + X) & 0xFF ] = v;
  72. #define    sZEROY(v)    mem[ (mem[Pc++] + Y) & 0xFF ] = v;
  73.  
  74. #define    ZIND        ptr = mem[ mem[Pc++] ];
  75. #define    ABINDX        stmp = mem[Pc++]; stmp |= mem[Pc++] << 8; ptr = mem[stmp++]; ptr |= mem[stmp] << 8; ptr += X;
  76.  
  77.  
  78. /*
  79.  *  Since we store flags as 0/nonzero instead of 0/1, we need to turn
  80.  *  nonzero back into 1.  Thus, "!!" is not a no-op.
  81.  */
  82.  
  83. #define    get_status()   ((!!N << 7)|(!!V << 6)|(!!B << 4)|(!!D << 3)|(!!I << 2)|(!NZ << 1)|(!!C))
  84.  
  85. extern unsigned char mem[];           /* 64K memory image */
  86. extern unsigned char jmp_tbl[];           /* jmp & jsr interceptor functions */
  87. extern int (*mem_set[])();           /* memory store interceptors */
  88.  
  89. extern unsigned char mem_map();
  90.  
  91.  
  92. extern unsigned short Pc;
  93. extern unsigned char Sp;    /* stack pointer     */
  94. extern unsigned int A;        /* accumulator        */
  95. extern unsigned char X;        /* X register        */
  96. extern unsigned char Y;        /* Y register        */
  97.  
  98. extern unsigned int N;        /* 7 - sign        */
  99. extern unsigned int V;        /* 6 - Overflow        */
  100.                 /* 5 - Unused        */
  101. extern unsigned int B;        /* 4 - Break        */
  102. extern unsigned int D;        /* 3 - Decimal        */
  103. extern unsigned int I;        /* 2 - Interrupt    */
  104. extern unsigned int NZ;        /* 1 - inverse of Zero  */
  105. extern unsigned int C;        /* 0 - Carry        */
  106.  
  107.  
  108. /*
  109.  *  Note:
  110.  *    Flags are stored as zero/nonzero instead of 0/1, except for
  111.  *    N which is stored 0/0x80.  NZ is "not Z"; use !NZ to get
  112.  *    the zero flag.
  113.  *
  114.  *    The flags code is tight, especially around overflow set on ADC
  115.  *    and SBC.  Integer basic is a good test to see if it still works.
  116.  */
  117.  
  118.  
  119. #define        M_NONE        0
  120. #define        M_ZP        1
  121. #define        M_ZPX        2
  122. #define        M_ZPY        3
  123. #define        M_IND        4
  124. #define        M_INDX        5
  125. #define        M_INDY        6
  126. #define        M_ABS        7
  127. #define        M_ABSX        8
  128. #define        M_ABSY        9
  129. #define        M_IMM        10
  130. #define        M_REL        11
  131. #define        M_ZIND        12    /* zero page indirect, 65C02 */
  132. #define        M_ABINDX    13    /* for jmp $7C in 65C02 */
  133.  
  134.  
  135. extern int ram_read;
  136. extern int ram_write;
  137. extern int bank2_enable;
  138.  
  139. struct op_info {
  140.     char *name;
  141.     int add_mode;
  142. };
  143.  
  144. extern struct op_info opcode[];
  145. extern int running;
  146. extern int tracing;
  147. extern char *my_malloc();
  148. extern int term_lines, term_cols;
  149.  
  150. extern int text1[];        /* base addresses for text page 1 */
  151. extern int last_line;        /* line the cursor is on now */
  152. extern int last_col;        /* current column of cursor */
  153.  
  154. extern int disk[2];
  155. extern int write_prot[2];
  156. extern int drive;
  157.  
  158. #define    DO_RTS    Pc = pop(); Pc |= pop() << 8; Pc++;
  159.  
  160.